草庐IT

「codeforces - 1394C」Boboniu and String

全部标签

Codeforces 1672 E. notepad.exe

题意这是一道交互题,有n个字符串,每个字符串长度:0-2000,n:0-2000有一个机器对他进行排版,你可以给他一个每行的最大宽度w,那么每行只能放长度为w的字符;每行相邻两个字符串之间至少有一个空格,每行结尾可以不用,机器会按照贪心原则进行排版,保证排版后的高度尽量小。你可以进行n+30次询问,每次询问你可以给个w,他会给你排版后高度h,让你求出w*h的最小值。做题吐槽这题很典型的构造题,不会就是不会,会了一下子就会做了,这种题感觉就是要一下子找到题目的突破点,挖掘出这类题目的特征,感觉自己还是菜,每个突破点想到了,但是没串连起来,继续加油!提示1.答案的范围变化是很小的,变化范围只有0-

Codeforces 1672 F1. Array Shuffling

题意给一个n个数的数列a,a[i]定义一个操作:每次可以交换任意位置的两个值;定义最优操作:对于任意一个原数列的一组排列,使其通过尽可能少的操作变回原数列;求构造一组原数列的一组排列,使得在最优操作下操作次数尽可能多;一开始读错题了,读成只能交换相邻点,一直在考虑逆序对,终于写出来了以后,一直wa,才发现原来是任意点交换,哭提示1.考虑每个点的值没有重复的话,那么很简单,直接构建一个环就好了,操作次数N-12.考虑到有两个相同数值的在一个环里的话,那么就可以分裂成两个环,这样最优解的个数就能减一3.因此只需要每次构建一个环,把所有数值的点每次囊括进去一个,直到没有环就好了代码#includeu

Codeforces 1674 E. Breaking the Wall

题意给n个数的数列a[n],可以进行任意次操作,每次选取一个位置i,a[i]-=2,a[i-1]-=1,a[i+1]-=1,问最少几次操作可以让任意两个值提示需要进行分类讨论,分成三种情况讨论1.两个数是相邻的,那么则需要解方程,x,y代表两点分别进行多少次2.两个数间隔一位的话,那么需要解方程,x,y代表两点分别进行多少次,z代表中间点需要多少次3.任意两点,直接排序取两个最小值ceil(x/2)即可这道题比较简单,看完题目以后解题思路就比较明显了,比赛的提交很多人被hack了,估计是一些边界值考虑出错导致的,代码实现也比较简单代码#includeusingnamespacestd;inta

Codeforces 1682 D Circular Spanning Tree

题意1-n排列,构成一个圆;1-n每个点有个值0或者1,0代表点的度为偶数,1代表点的度为计数;询问能否构成一棵树,树的连边在圆内不会相交,在圆边上可以相交,可以则输出方案。提示1.首先考虑什么时候无解,显然,奇数点个数是偶数,并且>=22.由奇数点个数为偶数可以发现,它们可以连到同一个偶数点上(并非直接连)3.剩下的偶数点可以直接顺时针串联,直到连到最近的一个奇数点上4.相当于每个奇数点后面有一条偶数链,或者没有偶数链只有一个奇点(这都是一样的,因为链最后一个点都只剩下一个需要连的点),直接把链的最后一个点连在一起就好了代码#includeusingnamespacestd;chars[20

Codeforces 1672 E. notepad.exe

题意这是一道交互题,有n个字符串,每个字符串长度:0-2000,n:0-2000有一个机器对他进行排版,你可以给他一个每行的最大宽度w,那么每行只能放长度为w的字符;每行相邻两个字符串之间至少有一个空格,每行结尾可以不用,机器会按照贪心原则进行排版,保证排版后的高度尽量小。你可以进行n+30次询问,每次询问你可以给个w,他会给你排版后高度h,让你求出w*h的最小值。做题吐槽这题很典型的构造题,不会就是不会,会了一下子就会做了,这种题感觉就是要一下子找到题目的突破点,挖掘出这类题目的特征,感觉自己还是菜,每个突破点想到了,但是没串连起来,继续加油!提示1.答案的范围变化是很小的,变化范围只有0-

Codeforces 1672 F1. Array Shuffling

题意给一个n个数的数列a,a[i]定义一个操作:每次可以交换任意位置的两个值;定义最优操作:对于任意一个原数列的一组排列,使其通过尽可能少的操作变回原数列;求构造一组原数列的一组排列,使得在最优操作下操作次数尽可能多;一开始读错题了,读成只能交换相邻点,一直在考虑逆序对,终于写出来了以后,一直wa,才发现原来是任意点交换,哭提示1.考虑每个点的值没有重复的话,那么很简单,直接构建一个环就好了,操作次数N-12.考虑到有两个相同数值的在一个环里的话,那么就可以分裂成两个环,这样最优解的个数就能减一3.因此只需要每次构建一个环,把所有数值的点每次囊括进去一个,直到没有环就好了代码#includeu

Codeforces 1674 E. Breaking the Wall

题意给n个数的数列a[n],可以进行任意次操作,每次选取一个位置i,a[i]-=2,a[i-1]-=1,a[i+1]-=1,问最少几次操作可以让任意两个值提示需要进行分类讨论,分成三种情况讨论1.两个数是相邻的,那么则需要解方程,x,y代表两点分别进行多少次2.两个数间隔一位的话,那么需要解方程,x,y代表两点分别进行多少次,z代表中间点需要多少次3.任意两点,直接排序取两个最小值ceil(x/2)即可这道题比较简单,看完题目以后解题思路就比较明显了,比赛的提交很多人被hack了,估计是一些边界值考虑出错导致的,代码实现也比较简单代码#includeusingnamespacestd;inta

Codeforces 1682 D Circular Spanning Tree

题意1-n排列,构成一个圆;1-n每个点有个值0或者1,0代表点的度为偶数,1代表点的度为计数;询问能否构成一棵树,树的连边在圆内不会相交,在圆边上可以相交,可以则输出方案。提示1.首先考虑什么时候无解,显然,奇数点个数是偶数,并且>=22.由奇数点个数为偶数可以发现,它们可以连到同一个偶数点上(并非直接连)3.剩下的偶数点可以直接顺时针串联,直到连到最近的一个奇数点上4.相当于每个奇数点后面有一条偶数链,或者没有偶数链只有一个奇点(这都是一样的,因为链最后一个点都只剩下一个需要连的点),直接把链的最后一个点连在一起就好了代码#includeusingnamespacestd;chars[20

Codeforces Round #831 (Div. 1 + Div. 2)

CodeforcesRound#831(Div.1+Div.2)1.Problem-D-Codeforces首先是一个结论就是如果除了起点终点以外你发现只要是还多一个格子你是可以把所有牌都任意移动的。然后这个问题就很好解决了。你每次需要把最大的牌移动到终点所以你得把这些他上面的牌都移动开即可。constintN=1e5+100;intn,m,k;inta[N];voidslove(){cin>>n>>m>>k;for(inti=1;i>a[i];a[i]=k-a[i];}vectorst(k);intsz=0;for(inti=1,j=0;jn*m-3){cout 2.Problem-E-Co

Codeforces Round #831 (Div. 1 + Div. 2)

CodeforcesRound#831(Div.1+Div.2)1.Problem-D-Codeforces首先是一个结论就是如果除了起点终点以外你发现只要是还多一个格子你是可以把所有牌都任意移动的。然后这个问题就很好解决了。你每次需要把最大的牌移动到终点所以你得把这些他上面的牌都移动开即可。constintN=1e5+100;intn,m,k;inta[N];voidslove(){cin>>n>>m>>k;for(inti=1;i>a[i];a[i]=k-a[i];}vectorst(k);intsz=0;for(inti=1,j=0;jn*m-3){cout 2.Problem-E-Co